3W - 버츄얼 서비스를 활용한 기본 트래픽 관리

개요

이번 주차부터 본격적으로 내부 트래픽 관리 방법을 파헤친다.
이스티오 설정의 핵심 원리와 작동 구조는 결국 엔보이에 기반한다는 것을 항상 숙지하고 있으면, 이스티오는 그다지 어렵지 않..으면 좋겠는데 어렵다
아무튼 트래픽 관리에 사용되는 기본 리소스들을 차근 차근 익혀가면 조금 더 이해도를 높여보자.

사전 지식

책에서 나온 개념은 간단하게만 짚겠다.
이번에 핵심적으로 다룰 트래픽 관리의 필요성을 나타내는 기반이 되기 때문이다.

배포와 릴리스

개발한 것들은 운영 환경에 실제로 배치하는 것을 배포(deployment)라고 한다.
흔히 생각하는 것은 운영 환경에 배치하는 것이 곧 유저의 트래픽을 받는 것으로 이어지는 것이나, 책에서는 여기에서 한 단계를 더 분리한다.
배치를 하고 실제로 트래픽을 받지 않는 채로 여러 테스트를 진행하거나 설정을 하는 것이 가능하며, 충분한 모니터링 이후에 실제 트래픽을 받도록 할 수도 있다.
이렇게 배포 이후에, 실제로 유저의 트래픽을 받도록 하는 과정을 릴리즈(release, 릴리스가 더 발음에 맞는 표현)라고 한다.
새로운 코드를 운영 환경에 도입하는 위험성을 줄이려면 배포와 릴리스를 분리하는 것이 중요하다.
이스티오는 이때 릴리스를 위해, 테스트를 위해 다양한 트래픽 관련 설정을 할 수 있다!

Virtual Service란?

이스티오의 대표적인 리소스로, 트래픽 라우팅 설정을 하는데 사용된다.
이름이 가상 서비스이지만, 실질적으론 쿠버네티스의 인그레스를 대체하는 리소스 정도로 이해하는 게 좋다.

기본이 되는 리소스인 만큼, 기능이 정말 많은데, 간단하게는 이렇게 요약할 수 있겠다.

리소스 등록 시 동작 과정

이 리소스를 만들었을 때 이뤄지는 이스티오의 동작 흐름은 다음과 같다.

버츄얼 서비스는 트래픽 라우팅 관련 설정을 정의하기에, 엔보이에 대해서 RDS 쪽을 건드리게 된다.
이때 데이터 플레인의 모든 엔보이를 설정해버리는 건 아니고 먼저 대상이 될 엔보이를 한정짓는 작업이 들어간다.

목적지 업스트림에는 클러스터(엔보이에서의 클러스터)를 지정해야 하는데, 기본적으로는 쿠버네티스 서비스를 지정할 수 있다.
서비스 메시 환경에서 해당 서비스에 대한 클러스터가 레지스트리로 전부 등록이 돼있어 서비스를 지정하더라도 그냥 클러스터를 지정하는 것과 다를 게 없다.
여기에 이스티오 데스티네이션룰을 설정하여 대상이 되는 클러스터를 부분집합(subset)으로 조금 더 세분화하는 게 가능하다.
데스티네이션 룰에 대해서는 이후 글에서 다루겠다.

버츄얼 리소스 양식 작성법

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  gateways:
  - mesh
  http:
  - match:
    - headers:
        end-user:
          exact: jason
    route:
    - destination:
        host: reviews
        subset: v2
  - route:
    - destination:
        host: reviews
        subset: v3

간단하게는 이런 식으로 세팅할 수 있다.
이 설정을 설명하자면,

핵심이 되는 필드만 간략하게 짚겠다.
자세한 정리는 버츄얼 서비스에 공식 문서를 거의 그대로 갖다박았다.

hosts

버츄얼서비스가 적용될 대상 호스트를 지정하는 필드로, 엔보이에서 RDS의 가상 호스트 부분을 설정하게 된다.
웬만해서 FQDN으로 설정하는 게 좋은데, 네임스페이스 별 규칙에 따라 FQDN이 완성되어 이를 기반으로 대상이 될 가상 호스트를 결정하기 때문이다.
그냥 reviews 이런 식으로 세팅하면 다른 네임스페이스에 있는 reviews 서비스로 접근을 못 한다던가 하는 오동작을 할 가능성이 있다.

gateways

  gateways:
  - mesh
  - ingress-gateway

버츄얼서비스의 설정이 적용될 엔보이를 결정짓는 필드이다.
단순하게 보자면 이 버츄얼서비스의 대상이 될 업스트림으로 트래픽을 보낼 다운스트림이 무엇인지 지정하는 필드이다.
이렇게 해석하면 버츄얼서비스로 들어오는 진입점(게이트웨이)을 지정한다는 의미로서 조금 더 직관적으로 이해할 수 있다.
그렇지만 실제 동작 방식을 따지자면 어디까지나 이 필드는 설정을 적용하고자 하는 엔보이가 무엇인지를 나타내는 것임을 유의하자.

여기에 이스티오 게이트웨이를 넣어주면 해당 게이트웨이에 해당하는 엔보이의 RDS에 설정이 적용된다.
mesh라는 값을 넣을 수도 있는데, 이건 현재 서비스 메시 내의 모든 엔보이 사이드카를 대상으로 하겠다는 뜻이다.
게이트웨이를 넣을 때 {게이트웨이 네임스페이스}/{게이트웨이 이름}과 같은 식으로 어떤 네임스페이스의 게이트웨이인지 명시할 수 있다.

http

버츄얼서비스의 핵심 설정들을 넣게 되는 필드로, http 필드 말고도 프로토콜 별로 작성할 수 있다.

이중에서 설정을 많이 할 수 있는 http 필드를 집중적으로 정리하겠다.

  http:
    # 이름은 디버깅이나 관리용이고, 실제 영향은 없다.
  - name: product
    # 조건 매칭
    match:
    - uri:
        prefix: "/productpage"
	# uri 재작성
	rewrite:
      uri: "/newcatalog"
    # 라우팅 설정
    route:
    - destination:
        host: reviews # reviews.default.svc.cluster.local로 해석된다.
        subset: v2
  - match:
    - uri:
        prefix: "/reviews"
    # 다른 버츄얼서비스로 트래픽 위임
    delegate:
        name: reviews
        namespace: nsB
  - route:
    - destination:
        host: events
        subset: v3

여기에 정말 다양한 설정을 넣을 수 있는데, 일단 전체 구조는 리스트로 작성한다.
이 리스트의 원소들은 순서대로 적용되기 때문에 세부적인 조건이나 설정이 담긴 라우팅 설정일수록 위에 배치하는 것이 좋다.

route

  - route:
    - destination:
        host: reviews.prod.svc.cluster.local
        subset: v2
      weight: 25
    - destination:
        host: reviews.prod.svc.cluster.local
        subset: v1
      weight: 75

라우팅할 업스트림 클러스터를 지정하는 핵심 필드는 route로, 여기에도 대상 목적지를 리스트로 작성한다.
destination.host에 대상 클러스터(서비스, 서비스 엔트리, 데룰)를 명시해주면 된다.
destination.subset이란 필드가 보이는데, 이것은 Istio DestinationRule을 지정해야만 사용할 수 있는 방식으로 해당 클러스터를 부분집합으로 나누었을 때 어떤 부분집합으로 보낼지에 대한 설정을 한다.
이번 실습에서 간단하게 데스티네이션 룰을 사용해 볼 건데 이런 게 있는 갑다 정도만 알아두자.
weight 필드로 가중치를 설정할 수 있다.

matches

  - match:
    - name: jason
      headers:
        end-user:
          exact: jason
      uri:
        prefix: "/ratings/v2/"
      ignoreUriCase: true

어떤 트래픽을 매칭할지 지정하는 필드로, 매칭할 땐 exact, prefix, regex 등을 사용할 수 있다.
이를 기반으로 다음의 필드들을 보자.

실습 진행

이번에는 실습 내용이 많아서 이에 최대한 충실하고자 기본 예제를 사용했다.
두 가지 버전을 가진 워크로드가 있을 때, 무작위로 트래픽을 분배하지 않고 원하는 대로 트래픽이 가도록 설정해본다.

기본 환경 세팅은 명시적으로 바꾸지 않는 이상 동일하니, 1W - 서비스 메시와 이스티오 참고.

k create ns istioinaction
k label ns istioinaction istio-injecton=enabled
k ns istioinaction

image.png
이번엔 일찌감치 실습에 사용할 파일들을 현 디렉토리에 위치시켰다.

초반 실습들은 이전 실습과 많이 겹쳐서 사실 간단하다.
대신 이번에는 각 리소스 설정이 실제로 어떤 엔보이에 영향을 미치고, 어떤 식으로 설정이 들어가는지 조금 집중적으로 보도록 한다.

기본적인 트래픽 라우팅

kubectl apply -f services/catalog/kubernetes/catalog.yaml
kubectl apply -f ch5/catalog-gateway.yaml
kubectl apply -f ch5/catalog-vs.yaml

기본적인 워크로드와 이에 대응하는 이스티오 리소스를 만든다.
image.png

while true; do curl -s http://catalog.istioinaction.io:30000/items/ -I --resolve "catalog.istioinaction.io:30000:127.0.0.1" | head -n 1 ; date "+%Y-%m-%d %H:%M:%S" ; sleep 0.5; echo; done

이번에도 키알리로 트래픽을 확인할 것이므로, 반복 접근을 해둔다.
image.png

kubectl apply -f services/catalog/kubernetes/catalog-deployment-v2.yaml

image.png
2 버전까지 바로 배포를 진행한다.
image.png
하나의 카탈로그 클러스터 안에 두 엔드포인트가 생긴 것이 보인다.

istioctl proxy-config endpoint deploy/istio-ingressgateway.istio-system --cluster 'outbound|80||catalog.istioinaction.svc.cluster.local' -oyaml

image.png
추가 인자를 넣어서 조금 더 엔보이의 설정을 면밀하게 관찰할 수 있다.

특정 버전으로만 트래픽 가도록 만들기

image.png
현재는 1,2버전이 같이 있는 상태인데 이 둘을 별 달리 구분짓고 있지 않다.
그래서 키알리로 확인하더라도 트래픽이 50퍼씩 동일하게 분산되고 있다.
image.png
버전 별로 클러스터를 세부 지정하기 하기 위해 버전 라벨을 사용할 수 있겠다!
참고로 버전 라벨이 보통 많이 쓰여서 키알리에서도 이를 기반으로 시각화를 해주기에 사용할 뿐, 원한다면 얼마든지 다른 라벨을 이용해도 된다.

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: catalog
spec:
  host: catalog.istioinaction.svc.cluster.local
  subsets:
  - name: version-v1
    labels:
      version: v1
  - name: version-v2
    labels:
      version: v2

데스티네이션 룰로 부분집합을 정의해보자.
다음에 조금 더 자세히 소개할 데스티네이션 룰은 서비스 레지스트리에 등록된 클러스터를 조금 더 세부적으로 정의하고 설정할 수 있게 해주는 리소스이다.
서비스 레지스트리에 등록된 클러스터에 대한 설정을 하는 것이기 때문에, CDS, EDS에만 영향을 끼칠 것을 짐작할 수 있다.
image.png
이를 적용하고 이스티오 컨트롤 플레인의 로그를 살펴보면, 데스티네이션 룰이 만들어졌다고 한 뒤에 여러 XDS 설정이 일어나는 것을 확인할 수 있다.

ads	XDS: Pushing Services:14 ConnectedEndpoints:3 Version:2025-04-21T13:54:52Z/25
delta	CDS: PUSH for node:catalog-v2-57b4fcdc75-p6zt8.istioinaction resources:7 removed:0 size:4.9kB cached:0/3
delta	CDS: PUSH for node:catalog-5899bbc954-bqvvf.istioinaction resources:7 removed:0 size:4.9kB cached:3/3
delta	CDS: PUSH for node:istio-ingressgateway-6567675ffd-jn2nr.istio-system resources:4 removed:0 size:3.9kB cached:0/3
delta	EDS: PUSH for node:catalog-v2-57b4fcdc75-p6zt8.istioinaction resources:24 removed:0 size:4.4kB empty:0 cached:23/24
delta	EDS: PUSH for node:istio-ingressgateway-6567675ffd-jn2nr.istio-system resources:1 removed:0 size:377B empty:0 cached:0/1
delta	EDS: PUSH for node:catalog-5899bbc954-bqvvf.istioinaction resources:24 removed:0 size:4.4kB empty:0 cached:24/24
delta	LDS: PUSH for node:istio-ingressgateway-6567675ffd-jn2nr.istio-system resources:1 removed:0 size:1.3kB
delta	RDS: PUSH for node:istio-ingressgateway-6567675ffd-jn2nr.istio-system resources:1 removed:0 size:539B cached:0/0
delta	LDS: PUSH for node:catalog-5899bbc954-bqvvf.istioinaction resources:23 removed:0 size:37.9kB
delta	LDS: PUSH for node:catalog-v2-57b4fcdc75-p6zt8.istioinaction resources:23 removed:0 size:37.9kB
delta	RDS: PUSH for node:catalog-5899bbc954-bqvvf.istioinaction resources:15 removed:0 size:11.2kB cached:14/15
delta	RDS: PUSH for node:catalog-v2-57b4fcdc75-p6zt8.istioinaction resources:15 removed:0 size:11.2kB cached:14/15
delta	EDS: PUSH request for node:catalog-5899bbc954-bqvvf.istioinaction resources:2 removed:0 size:460B empty:0 cached:0/2 filtered:24
delta	EDS: PUSH request for node:catalog-v2-57b4fcdc75-p6zt8.istioinaction resources:2 removed:0 size:460B empty:0 cached:2/2 filtered:24
delta	EDS: PUSH request for node:istio-ingressgateway-6567675ffd-jn2nr.istio-system resources:2 removed:0 size:460B empty:0 cached:0/2 filtered:1

그런데 로그로만 보면 LDS, RDS 등 너나 할 거 없이 신나게 설정이 적용된 모습을 볼 수 있다.
각각 실제로 설정이 들어갔을까?

istioctl pc cluster catalog-5899bbc954-bqvvf --fqdn catalog.istioinaction.svc.cluster.local

image.png
일단 어떤 놈이든 붙잡고 클러스터 설정을 뜯어보면 이렇게 같은 클러스터가 3개가 생긴 게 보인다.
정확하게는 같은 fqdn이 3개인 거고, 기본 클러스터만 있던 상태에서 하위 부분집합 클러스터 2개가 추가로 더 생긴 것이다.
image.png
위 그림은 istioctl pc cluster 명령을 json으로 출력한 다음 fx라는 명령 툴을 이용해 적당히 필요 없는 부분은 안 보이게 하고 찍은 것이다.
클러스터를 세부적으로 들여다보면 EDS 타입에 이름에 부분집합 정보가 담긴 클러스터가 들어간 것이 보인다.
메타데이터로도 부분집합 내용이 담겨있다.

istioctl pc endpoint catalog-v2-57b4fcdc75-p6zt8 --cluster "outbound|80||catalog.istioinaction.svc.cluster.local" 

image.png
이번엔 엔드포인트 설정으로도 보자.
엔드포인트로 보면 이렇게는 잘 드러나지 않는 것처럼 보인다.
image.png
그러나 사실 서브셋 정보를 토대로 각각의 엔드포인트가 생기긴 한 것을 볼 수 있다.
이렇게 여러 개의 엔드포인트가 생긴 이유는 사실 간단하다.
데스티네이션룰로 부분집합을 나눴다고 해서 무조건 각 부분집합으로만 트래픽을 보내야 하는 건 아니다.
당연히 부분집합으로 나뉘었던 기존 클러스터를 대상으로 트래픽을 보낼 수 있어야 하고, 이에 대한 엔드포인트가 그대로 남아있는 것이다.
위에 클러스터 설정을 봤을 때 부분집합에 속하지 않는 클러스터가 있는 것 역시 같은 맥락이다.

image.png
게이트웨이쪽 LDS가 건드려지길래 이런 식으로 before after 덤프를 떠서 diff로 차이를 비교해봤는데 서로 달라진 건 없었다.
데스티네이션 룰 리소스의 용도 상 LDS에 영향이 없는 것이 당연하다고 생각했는데, gpt에 물어봤을 때는 ADS가 일어나면서 다른 설정들도 동기화하기 위해 같이 설정이 되는 경우가 많다고 한다.
그러나 실질적으로 변하는 값은 없는 경우가 많다고.
image.png
동기화 상태를 보면, 데룰 하나 만들었다고 그냥 모든 XDS가 동기화되는 것을 볼 수 있다..
image.png
다른 서비스를 확인해봐도 LDS, RDS 쪽 변화가 없는 것은 마찬가지이다.

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: catalog-vs-from-gw
spec:
  hosts:
  - "catalog.istioinaction.io"
  gateways:
  - catalog-gateway
  http:
  - route:
    - destination:
        host: catalog
        subset: version-v1

아무튼 데스티네이션룰로 클러스터에 대한 상세 지정을 했기에 특정 부분집합으로 트래픽이 향하도록 설정하는 것이 가능하다.

버츄얼 서비스는 라우팅 설정을 하는 리소스이기에 실질적인 설정은 RDS에만 이뤄지는 것이 정상이다.
image.png
gateways 필드에는 인그레스 게이트웨이만 설정을 받도록 명시했다.
그래서 대상이 된 게이트웨이 엔보이에만 설정이 이뤄진 것을 볼 수 있다.

istioctl pc route -n istio-system istio-ingressgateway-6567675ffd-jn2nr --name http.8080 -ojson

image.png
http 관련 설정만 걸었으니 RDS만 설정이 이뤄졌다.
설정에서 대상이 되는 클러스터가 v1을 명확하게 가리키도록 설정된 것을 볼 수 있다.

Dark Launch

다크 런치(dark launch)란 새로운 릴리스로 실제로 트래픽을 보낼 수 있는 상태이지만, 특정 조건을 만족해야만 보낼 수 있도록 하는 전략을 말한다.
간단하게 특정 http 헤더를 추가했을 때만 v2로 가보도록 해보자.

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: catalog-vs-from-gw
spec:
  hosts:
  - "catalog.istioinaction.io"
  gateways:
  - catalog-gateway
  http:
  - match:
    - headers:
        x-istio-cohort:
          exact: "internal"
    route:
    - destination:
        host: catalog
        subset: version-v2
  - route:
    - destination:
        host: catalog
        subset: version-v1

버츄얼 서비스에서 라우팅 설정을 해준다.

curl http://catalog.istioinaction.io:30000/items -H "x-istio-cohort: internal" --resolve "catalog.istioinaction.io:30000:127.0.0.1" 

image.png
이렇게 이미지url 정보가 추가적으로 들어온다면 제대로 라우팅된 것이다!
image.png
이건 반복문은 돌리지 않고 연타를 쳤는데 1.1퍼까지는 찍었다 ㅋㅎㅋ..

istioctl pc route -n istio-system istio-ingressgateway-6567675ffd-jn2nr --name http.8080 -ojson 

image.png
라우팅 설정이 된 엔보이 설정을 보면 위처럼 설정이 그대로 들어간 것을 볼 수 있다.

메시 내부 라우팅 규칙 설정

지금까지 버츄얼 서비스로 게이트웨이쪽 엔보이에 설정이 되는 것을 확인할 수 있었다.
그러나 이건 어디까지 대상을 게이트웨이로 설정했기 때문이고, 서비스 메시 내부에서 라우팅 적용을 받도록 설정하는 것도 가능하다.
gateways 필드를 기입하지 않으면 이게 기본값이기도 하다.

kubectl delete gateway,virtualservice,destinationrule --all -n istioinaction
kubectl apply -n istioinaction -f services/webapp/kubernetes/webapp.yaml

기존 실습하던 이스티로 리소스만 지우고 새로 배포한다.
또한 웹앱 양식 파일도 같이 배포해준다.
이번에는 catalog 서비스에 게이트웨이에서 바로 접근하지 않고 webapp이 catalog를 호출하도록 세팅할 것이다.

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: coolstore-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "webapp.istioinaction.io"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: webapp-virtualservice
spec:
  hosts:
  - "webapp.istioinaction.io"
  gateways:
  - coolstore-gateway
  http:
  - route:
    - destination:
        host: webapp
        port:
          number: 80

이번에는 catalog 앞단에 webapp을 두어서 트래픽을 접근하는 식으로 세팅해보자.

WEBAPP="webapp.istioinaction.io"
while true; do curl -s "http://$WEBAPP:30000/api/catalog" -I --resolve "$WEBAPP:30000:127.0.0.1" | head -n 1 ; date "+%Y-%m-%d %H:%M:%S" ; sleep 1; echo; done
while true; do curl -s -H "x-istio-cohort: internal" "http://$WEBAPP:30000/api/catalog" -I --resolve "$WEBAPP:30000:127.0.0.1" | head -n 1 ; date "+%Y-%m-%d %H:%M:%S" ; sleep 1; echo; done

이번에도 반복 접근을 걸어둔다.
image.png
트래픽은 정상적으로 나온다.
그러나 위에서 설정한 버츄얼 서비스는 게이트웨이에서 webapp으로 향하는 값만 설정했다.
그렇다면 webapp에서 catalog로 트래픽은 지금 어떻게 가고 있는 것인가?

apiVersion: telemetry.istio.io/v1alpha1
kind: Telemetry
metadata:
  name: webapp
  namespace: istioinaction
spec:
  selector:
    matchLabels:
      app: webapp
  accessLogging:
  - providers:
    - name: envoy
    disabled: false

이건 간단하게 로깅 세팅을 하면 바로 알 수 있다.
1주차에서 잠시 언급했던 텔레메트리 리소스를 세팅한다.

"HEAD /api/catalog HTTP/1.1" 200 - via_upstream - "-" 0 0 4 3 "172.18.0.1" "curl/8.5.0" "9c8d4bfb-52d2-4db7-a6ac-d5ab8ce0db10" "webapp.istioinaction.io:30000" "10.10.0.25:8080" inbound|8080|| 127.0.0.6:56465 10.10.0.25:8080 172.18.0.1:0 outbound_.80_._.webapp.istioinaction.svc.cluster.local default
"GET /items HTTP/1.1" 200 - via_upstream - "-" 0 698 2 1 "172.18.0.1" "beegoServer" "6dcff67b-1e5b-4b22-a6a2-ae90d2904edc" "catalog.istioinaction:80" "10.10.0.24:3000" outbound|80||catalog.istioinaction.svc.cluster.local 10.10.0.25:48792 10.200.1.98:80 172.18.0.1:0 - default

그럼 webapp 프록시의 로그를 뜯어볼 수 있게 된다.
HEAD는 내 로컬에서 webapp으로 날린 요청, GET이 webapp에서 catalog로 날아가는 요청인데, 여기에서 중요하게 볼 지점은 가장 마지막 부분이다.
image.png
webapp의 엔보이는 10.200 대역으로 요청을 날리는데, 이 대역은 현재 쿠버네티스 서비스 대역이다.
즉, webapp에서 catalog로의 요청은 서비스 메시로 처리되지 않고 메시 외부로서 쿠버네티스 서비스로 요청이 날아간 것이다!
image.png
RDS 설정을 봐도 약간 확인할 수 있는데, catalog로 가는 라우팅 정보가 들어있기는 하지만 뒤에 버츄얼 서비스는 설정되지 않은 것을 볼 수 있다.

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: catalog
spec:
  host: catalog.istioinaction.svc.cluster.local
  subsets:
  - name: version-v1
    labels:
      version: v1
  - name: version-v2
    labels:
      version: v2
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: catalog
spec:
  hosts:
  - catalog
  gateways:
    - mesh
  http:
  - match:
    - headers:
        x-istio-cohort:
          exact: "internal"
    route:
    - destination:
        host: catalog
        subset: version-v2
  - route:
    - destination:
        host: catalog
        subset: version-v1

그럼 이제 서비스 메시 내부적으로 모든 트래픽을 처리할 수 있도록 라우팅 설정을 해주도록 하자.
아까와 같이 데룰을 만들어 클러스터를 부분집합으로 나눈 뒤에 이를 기반으로 라우팅을 설정했다.
이 설정에서 gateways 필드에 mesh를 세팅했는데, 이렇게 하면 메시 안의 모든 서비스가 진입점이 된다는 뜻이다.
(위에서 말했듯 생략하면 이게 기본 값이다.)
image.png
키알리에서도 catalog 쪽을 보면 버츄얼 서비스 아이콘이 생성된 것을 확인할 수 있다.
image.png
보다시피 서비스 메시의 모든 서비스의 RDS에 영향을 준 것을 볼 수 있다.
(CDS는 틈만 나면 같이 동기화된다..)
image.png
라우팅 설정 정보를 보면 이번에는 명확하게 버츄얼 서비스가 세팅된 것도 확인할 수 있다!

결론

이번 주차의 첫번째는 여태 했던 주차들과 크게 다르지 않다.
따지자면 이스티오 기능들 중 발가락만 핥고 있는 격인데, 기왕 핥을 거 조금 더 성실하게 핥아서 실제 엔보이에 설정이 어떻게 들어가는지도 알아보았다.
재차 강조하지만 엔보이를 잘 알면 알수록 이스티오의 동작 방식을 더 잘 이해할 수 있게 되니, 엔보이에 익숙해지기 위한 시간을 가진다고 생각하고 실습과 공부를 진행하는 게 좋다.

이전 글, 다음 글

다른 글 보기

이름 index noteType created
1W - 서비스 메시와 이스티오 1 published 2025-04-10
1W - 간단한 장애 상황 구현 후 대응 실습 2 published 2025-04-10
1W - Gateway API를 활용한 설정 3 published 2025-04-10
1W - 네이티브 사이드카 컨테이너 이용 4 published 2025-04-10
2W - 엔보이 5 published 2025-04-19
2W - 인그레스 게이트웨이 실습 6 published 2025-04-17
3W - 버츄얼 서비스를 활용한 기본 트래픽 관리 7 published 2025-04-22
3W - 트래픽 가중치 - flagger와 argo rollout을 이용한 점진적 배포 8 published 2025-04-22
3W - 트래픽 미러링 패킷 캡쳐 9 published 2025-04-22
3W - 서비스 엔트리와 이그레스 게이트웨이 10 published 2025-04-22
3W - 데스티네이션 룰을 활용한 네트워크 복원력 11 published 2025-04-26
3W - 타임아웃, 재시도를 활용한 네트워크 복원력 12 published 2025-04-26
4W - 이스티오 메트릭 확인 13 published 2025-05-03
4W - 이스티오 메트릭 커스텀, 프로메테우스와 그라파나 14 published 2025-05-03
4W - 오픈텔레메트리 기반 트레이싱 예거 시각화, 키알리 시각화 15 published 2025-05-03
4W - 번외 - 트레이싱용 심플 메시 서버 개발 16 published 2025-05-03
5W - 이스티오 mTLS와 SPIFFE 17 published 2025-05-11
5W - 이스티오 JWT 인증 18 published 2025-05-11
5W - 이스티오 인가 정책 설정 19 published 2025-05-11
6W - 이스티오 설정 트러블슈팅 20 published 2025-05-18
6W - 이스티오 컨트롤 플레인 성능 최적화 21 published 2025-05-18
8W - 가상머신 통합하기 22 published 2025-06-01
8W - 엔보이와 iptables 뜯어먹기 23 published 2025-06-01
9W - 앰비언트 모드 구조, 원리 24 published 2025-06-07
9W - 앰비언트 헬름 설치, 각종 리소스 실습 25 published 2025-06-07
7W - 이스티오 메시 스케일링 26 published 2025-06-09
7W - 엔보이 필터를 통한 기능 확장 27 published 2025-06-09

관련 문서

이름 noteType created
Istio VirtualService knowledge 2025-04-21
3W - 버츄얼 서비스를 활용한 기본 트래픽 관리 published 2025-04-22
3W - 트래픽 가중치 - flagger와 argo rollout을 이용한 점진적 배포 published 2025-04-22
3W - 타임아웃, 재시도를 활용한 네트워크 복원력 published 2025-04-26

참고